package com.javaweb.web.service;

import java.util.List;

import com.javaweb.base.po.RoleRestrict;
import com.javaweb.base.po.User;
import com.javaweb.util.entity.Page;
import com.javaweb.web.eo.roleRestrict.ProvinceCityDistrictAllResponse;
import com.javaweb.web.eo.roleRestrict.RoleRestrictAddRequest;
import com.javaweb.web.eo.roleRestrict.RoleRestrictListRequest;
import com.javaweb.web.eo.roleRestrict.RoleRestrictModifyRequest;
import com.javaweb.web.eo.roleRestrict.RoleRestrictResponse;

/**
 * 角色限定模块业务层接口
 * 
 * @author tank2140896
 */
public interface RoleRestrictService {
	
	/**
	 * 判断角色限定是否存在交集业务层接口
	 * 
	 * @param province 省
	 * @param city 市
	 * @param district 区
	 * @param roleId 角色ID
	 * @param restrictWay 角色限定方式（参见RoleRestrict#restrictWay）
	 * @return boolean true：存在交集；false：不存在交集
	 */
	boolean roleRestrictIntersect(String province,String city,String district,String roleId,Integer restrictWay);
	
	/**
	 * 角色限定新增业务层接口
	 * 
	 * @param roleRestrictAddRequest 角色限定新增请求参数
	 * @param user 用户信息
	 */
	void roleRestrictAdd(RoleRestrictAddRequest roleRestrictAddRequest,User user);
	
	/**
	 * 角色限定详情业务层接口
	 * 
	 * @param roleRestrictId 角色限定ID
	 * @return RoleRestrict 角色限定信息
	 */
	RoleRestrict roleRestrictDetail(String roleRestrictId);

	/**
	 * 角色限定修改业务层接口
	 * 
	 * @param roleRestrictModifyRequest 角色限定修改请求参数
	 * @param user 用户信息
	 */
	void roleRestrictModify(RoleRestrictModifyRequest roleRestrictModifyRequest,User user);
	
	/**
	 * 角色限定删除业务层接口
	 * 
	 * @param roleRestrictId 角色限定ID
	 */
	void roleRestrictDelete(String roleRestrictId);
	
	/**
	 * 角色限定列表业务层接口
	 * 
	 * @param roleRestrictListRequest 角色限定列表请求参数
	 * @return Page 分页参数
	 */
	Page roleRestrictList(RoleRestrictListRequest roleRestrictListRequest);
	
	/**
	 * 合并省市区列表业务层接口
	 * 
	 * @param list 省市区列表
	 * @return List<ProvinceCityDistrictAllResponse> 合并后的省市区列表
	 */
	List<ProvinceCityDistrictAllResponse> mergeSSQResponseList(List<ProvinceCityDistrictAllResponse> list);
	
	/**
	 * 获取权限代码业务层接口
	 * 
	 * @param bestMatchingPattern 最佳匹配路径
	 * @return String 权限代码
	 */
	@Deprecated
	String getPrivilegeCode(/*HttpServletRequest httpServletRequest,*/String bestMatchingPattern);
	
	/**
	 * 判断个人所在的省市区与组织是否重叠业务层接口
	 * 
	 * @param containsPersonal 是否包含个人限定
	 * @param user 用户信息
	 * @param list 省市区列表
	 * @return boolean true：个人和组织重叠；false：个人和组织无重叠
	 */
	boolean personalInOrganize(boolean containsPersonal,User user,List<ProvinceCityDistrictAllResponse> list);
	
	/**
	 * 个人和组织重叠时的省市区获取（不重叠时并集处理方式）业务层接口
	 * 
	 * @param user 用户信息
	 * @param personalInOrganize 个人所在的省市区与组织是否重叠（true：个人和组织重叠；false：个人和组织无重叠）
	 * @param list 省市区列表
	 * @return List<ProvinceCityDistrictAllResponse> 省市区列表
	 */
	List<ProvinceCityDistrictAllResponse> getOverlayList(User user,boolean personalInOrganize,List<ProvinceCityDistrictAllResponse> list);
	
	/**
	 * 角色限定信息获取业务层接口
	 * 
	 * @param user 用户信息
	 * @param bestMatchingPattern 最佳匹配路径
	 * @param clientType 客户端类型
	 * @return RoleRestrictResponse 角色限定信息
	 */
	RoleRestrictResponse roleRestrict(User user,/*HttpServletRequest httpServletRequest,*/String bestMatchingPattern,Integer clientType);
	
	/**
	 * 角色限定信息获取业务层接口
	 * 
	 * @param user 用户信息
	 * @param bestMatchingPattern 最佳匹配路径
	 * @param privilegeCode 权限代码（或叫alias别名）
	 * @param clientType 客户端类型
	 * @return RoleRestrictResponse 角色限定信息
	 */
	RoleRestrictResponse roleRestrict(User user,/*HttpServletRequest httpServletRequest,*/String bestMatchingPattern,String privilegeCode,Integer clientType);
	
}
